package com.atguigu.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.UUID;

@Service
public class OssServiceImpl implements OssService {
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        //获取到OSS中的配置
        String endpoint = ConstantPropertiesUtils.END_POINT;
        String keyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String keySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
        try {
            //1、创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, keyId, keySecret);

            //第一个参数：bucket名称，第二个参数是上传文件的路径和名称，第三参数是输入流
            InputStream inputStream = file.getInputStream();//获取文件的输入流
            String filename = file.getOriginalFilename();//获取文件的名称

            /**
             * 解决重复提交相同名字的图片，后面提交的会覆盖前面提交的图片，
             * 解决办法：给图片名称生成一个唯一值
             */
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");//去除掉随机值中的短横线
            filename=uuid+filename;//两个都是字符串，直接拼接

            //将文件按照日期进行分类
            //获取当前日期
            String datePath= new DateTime().toString("yyyy/MM/dd");
            filename=datePath+"/"+filename;

            //2、上传文件
            ossClient.putObject(bucketName,filename,inputStream);
            //3、关闭OSSClient
            ossClient.shutdown();

            //返回上传文件的路径
            //拼接字符串的,https://edu-1008.oss-cn-chengdu.aliyuncs.com/01.jpg
            String url="https://"+bucketName+"."+endpoint+"/"+filename;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
